﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using AerolineaApp.Models;

namespace AerolineaApp.Controllers
{ 
    public class VueloController : Controller
    {
        private AerolineaBD db = new AerolineaBD();

        public IEnumerable<Pais> ListaPaises()
        {
            var paises = from p in db.Paises
                         select p;

            return paises;
        }

        public ViewResult Index()
        {
            var vuelos = db.Vuelos.Include(v => v.Avion).Include(v => v.Aerolinea);
            return View(vuelos.ToList());
        }

        public ViewResult Details(int id)
        {
            Vuelo vuelo = db.Vuelos.Find(id);
            return View(vuelo);
        }

        public ActionResult Create()
        {
            ViewBag.Ciudad_Origen = new SelectList(db.Paises, "Id", "Codigo");
            ViewBag.Ciudad_Destino = new SelectList(db.Paises, "Id", "Codigo");
            ViewBag.AvionId = new SelectList(db.Aviones, "Id", "Descripcion");
            ViewBag.AerolineaId = new SelectList(db.Aerolineas, "Id", "Nombre");
            return View();
        }

        [HttpPost]
        public ActionResult Create(Vuelo vuelo)
        {
            if (ModelState.IsValid)
            {

                Avion avion = (from a in db.Aviones
                               where vuelo.AvionId == a.Id
                               select a).Single();

                var vuelos = from v in db.Vuelos
                             select v;

                if (avion.Dia < DateTime.Today)
                {
                    avion.Numero_Vuelos = 0;
                    db.SaveChanges();
                }

                foreach (var item in vuelos)
                {
                    if (vuelo.Fecha.Day == item.Fecha.Day && item.AvionId == vuelo.AvionId)
                    {
                        ViewBag.Ciudad_Origen = new SelectList(db.Paises, "Id", "Codigo", vuelo.Ciudad_Origen);
                        ViewBag.Ciudad_Destino = new SelectList(db.Paises, "Id", "Codigo", vuelo.Ciudad_Destino);
                        ViewBag.AvionId = new SelectList(db.Aviones, "Id", "Descripcion", vuelo.AvionId);
                        ViewBag.AerolineaId = new SelectList(db.Aerolineas, "Id", "Nombre", vuelo.AerolineaId);
                        TempData["Alert"]="Este Avion Ya Tiene Un Vuelo En ese mismo horario";
                        return View(vuelo);
                    }
                    else if (avion.Numero_Vuelos >= 3)
                    {
                        ViewBag.Ciudad_Origen = new SelectList(db.Paises, "Id", "Codigo", vuelo.Ciudad_Origen);
                        ViewBag.Ciudad_Destino = new SelectList(db.Paises, "Id", "Codigo", vuelo.Ciudad_Destino);
                        ViewBag.AvionId = new SelectList(db.Aviones, "Id", "Descripcion", vuelo.AvionId);
                        ViewBag.AerolineaId = new SelectList(db.Aerolineas, "Id", "Nombre", vuelo.AerolineaId);
                        TempData["Alert"] = "Este Avion no puede tener tres vuelos en el mismo dia"; 
                        return View(vuelo);
                    }
                }

                vuelo.Fecha = vuelo.Fecha.AddHours(DateTime.Now.Hour);
                db.Vuelos.Add(vuelo);
                avion.Dia = DateTime.Today;
                avion.Numero_Vuelos += 1;
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            ViewBag.Ciudad_Origen = new SelectList(db.Paises, "Id", "Codigo", vuelo.Ciudad_Origen);
            ViewBag.Ciudad_Destino = new SelectList(db.Paises, "Id", "Codigo", vuelo.Ciudad_Destino);
            ViewBag.AvionId = new SelectList(db.Aviones, "Id", "Descripcion", vuelo.AvionId);
            ViewBag.AerolineaId = new SelectList(db.Aerolineas, "Id", "Nombre", vuelo.AerolineaId);
            return View(vuelo);
        }

        public ActionResult Edit(int id)
        {
            Vuelo vuelo = db.Vuelos.Find(id);
            ViewBag.AvionId = new SelectList(db.Aviones, "Id", "Descripcion", vuelo.AvionId);
            ViewBag.AerolineaId = new SelectList(db.Aerolineas, "Id", "Nombre", vuelo.AerolineaId);
            return View(vuelo);
        }

        [HttpPost]
        public ActionResult Edit(Vuelo vuelo)
        {
            if (ModelState.IsValid)
            {
                db.Entry(vuelo).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.AvionId = new SelectList(db.Aviones, "Id", "Descripcion", vuelo.AvionId);
            ViewBag.AerolineaId = new SelectList(db.Aerolineas, "Id", "Nombre", vuelo.AerolineaId);
            return View(vuelo);
        }

        public ActionResult Delete(int id)
        {
            Vuelo vuelo = db.Vuelos.Find(id);
            return View(vuelo);
        }

        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {
            Vuelo vuelo = db.Vuelos.Find(id);

            Avion avion = (from a in db.Aviones
                           where vuelo.AvionId == a.Id
                           select a).Single();

            if (avion.Numero_Vuelos != 0)
            {
                avion.Numero_Vuelos -= 1;
            }
            db.Vuelos.Remove(vuelo);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}